/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package interfaz_esclavo;

import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.net.InetAddress;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import org.hyperic.sigar.CpuInfo;
import org.hyperic.sigar.CpuPerc;
import org.hyperic.sigar.FileSystem;
import org.hyperic.sigar.FileSystemUsage;
import org.hyperic.sigar.Mem;
import org.hyperic.sigar.MultiProcCpu;
import org.hyperic.sigar.NfsFileSystem;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.SigarProxy;
import org.hyperic.sigar.SigarProxyCache;


/**
 *
 * @author Leonardo Parra
 * Soportado en la libreria SIGAR con licencia GPL2 
 * Se puede encontrar en https://support.hyperic.com/display/SIGAR/Home
 */
public class Informacion extends UnicastRemoteObject implements InterfaceRemote{
    
 private final Sigar sigar;
 private final SigarProxy proxy;
 private final MultiProcCpu proceso;

    public Informacion() throws   RemoteException{
        this.sigar = new Sigar();
        proxy = SigarProxyCache.newInstance(this.sigar); 
        proceso = new MultiProcCpu();
    }
    
    public String informarSO() throws Exception{
        String data="";
        OperatingSystemMXBean so = ManagementFactory.getOperatingSystemMXBean();
        InetAddress localHost = InetAddress.getLocalHost();
        data+="========INFORMACIÓN SISTEMA OPERATIVO============"+"\n";
        data+= "Nombre PC: "+ localHost.getHostName()+"\n";
        data+= "Sistema Operativo: "+ so.getName()+"\n";
        data+="Version: "+so.getVersion()+"\n";
        data+= "Cantidad de procesadores: "+ so.getAvailableProcessors()+"\n";
        data+= "Arquitectura: "+ so.getArch()+"\n";
        return data;
    }
    
    public String informarCpu() throws Exception
    {
        CpuInfo[] infos = null;
        CpuPerc[] cpus = null; 
        String data ="";  
        cpus = sigar.getCpuPercList();
     data += "========INFORMACIÓN CPUS DINAMICA======="+"\n";
     for(int i =0; i<cpus.length;i++)
     {
         data += "Consumo CPU "+(i+1)+" "+CpuPerc.format(cpus[i].getUser())+"\n";
     }
     data += "Consumo total de CPU: "+ CpuPerc.format(sigar.getCpuPerc().getUser())+"\n";
     return data; 
    }
    
    public String infoDiscoArchivos() throws Exception{
        
        FileSystem[] listaSistemaArchivos = proxy.getFileSystemList();
        String data = "";
        for (int i = 0; i < listaSistemaArchivos.length; i++) {
            data+=imprmirSistemaArchivos(listaSistemaArchivos[i]);
        }
        return data;
    }

    private String imprmirSistemaArchivos(FileSystem fileSystem) throws Exception {
        long usado,disponible,total,porcentaje,archivos;
        String data ="";
        try{
        
        FileSystemUsage uso;
        if(fileSystem instanceof NfsFileSystem)
        {
            NfsFileSystem nfs = (NfsFileSystem) fileSystem;
            if(!nfs.ping()){
                System.out.println(nfs.getUnreachableMessage());   
            }
        }
        uso = sigar.getFileSystemUsage(fileSystem.getDirName());
        System.out.println(fileSystem.getDirName());
        
        usado = ((uso.getTotal()- uso.getFree())/1024)/1024;
        disponible = (uso.getAvail()/1024)/1024;
        total = (uso.getTotal()/1024)/1024;
        porcentaje = (long) (uso.getUsePercent()*100);
        archivos = uso.getFiles();
        
            if(!fileSystem.getTypeName().equals("none"))
            {
                data ="===========SISTEMA ARCHIVOS=========="+"\n";
                data += "Directorio: "+fileSystem.getTypeName()+"\n";
                data += "Total: "+total+"Gb"+"\n";
                data += "Usado: "+usado+"Gb"+"\n";
                data += "Disponible: "+disponible+"Gb"+"\n";
                data += "Porcentaje: "+porcentaje+"%"+"\n";
                if(archivos!=-1)
                {
                data += "Cantidad Archivos: "+ archivos+"\n";
                }
                else {
                    data+="No tiene permisos para contar los archivos"+"\n";
                }
            }
        }catch(SigarException e)
        {
            System.out.println("No hay acceso");
        }   
        return data; 
   
    }
    
    public String infoMemoria() throws Exception{
        String data ="";
        Mem memoria =  sigar.getMem();
        data+="========MEMORIA FISICA======"+"\n";
        data+="Total: "+ (memoria.getTotal()/1024)/1024+" Mb"+"\n";
        data+="Usada: "+ (memoria.getUsed()/1024)/1024+" Mb"+"\n";
        data+="Disponible: "+(memoria.getFree()/1024)/1024+ "Mb"+"\n";
        return data;
        
    }
    
    public String infoHilosProcesos() throws Exception{
        String data ="========INFORMACIÓN PROCESOS Y HILOS==========="+"\n";
        data += "Número de hilos activos: "+this.proceso.getPercent()+"\n";
        data += "Número de procesos activos: " + sigar.getProcList().length+"\n";
        return data;
    }


    public String infoEstaticaCpu() throws Exception {
     String data =""; 
     CpuInfo[] infos = null;
     CpuPerc[] cpus = null; 
     infos = sigar.getCpuInfoList();  
     CpuInfo info = infos[0];
     data+= "========INFORMACIÓN CPUS ESTATICA======="+"\n";
     data += "Fabricante: "+ info.getVendor()+"\n";
     data += "Modelo: "+info.getModel()+"\n";
     data += "Velocidad: "+info.getMhz()+" Mhz"+"\n";
        System.out.println("Data:"+ data);
     return data;
    }
    
    
}
